#ifndef APPLICATION_H_
#define APPLICATION_H_

#include "app/InputEvent.h"

#include "map/car/Car.h"
#include "map/controllers/CarController.h"
#include "map/MapFactory.h"

#include "util/exceptions/Exception.h"
#include "util/logger/Logger.h"
#include "util/LinkedList.h"

#include <string>
namespace app {

/*
 * Clase que representa la aplicacion corriendose.
 */
class Application {
public:

	/* Constructor */
	Application(util::LinkedList<std::string> &params, std::string configPath = "res");

	/* Destructor */
	virtual ~Application();

	/* Corre la aplicacion. */
	virtual void run() throw (util::Exception);

	/* Actualiza el modelo a partir de un evento. Devuelve false en caso que haya que cerrar
	 * la aplicacion. */
	virtual bool processEvent(InputEvent event);

private:
	Uint32 FRAME_RATE;
	Map* map;
	map::Car car;
	CarController* carController;
	QueryRoute* qRoute;
	util::Logger* logger();
	void createQuery(util::LinkedList<std::string> params);
};

}

#endif /* APPLICATION_H_ */
